/*
    文件内容: Buffer类,封装Buffer,用来接受发送数据
    文件名: Buffer.cpp
    作者: 中国好青年(码农论坛)
    时间: 2024/9/9
*/

#include "Buffer.h"

/* 
    函数名: Buffer()
    返回值: 无
    参  数: 无
    函数作用: Buffer构造函数
*/
Buffer::Buffer(uint16_t sep):sep_(sep)
{

}

/* 
    函数名: ~Buffer()
    返回值: 无
    参  数: 无
    函数作用: Buffer析构函数
*/
Buffer::~Buffer()
{
    
}

/* 
    函数名: append(const char *data, size_t size)
    返回值: 无
    参  数: const char *data, 追加数据的地址; size_t size, 追加数字大小
    函数作用: 追加数据到buf_
*/
void Buffer::append(const char *data, size_t size)
{
    buf_.append(data,size);
}

/* 
    函数名: appendWithHead(const char *data, size_t size)
    返回值: 无
    参  数: const char *data, 追加数据的地址; size_t size, 追加数字大小
    函数作用: 添加报文头部,在发送
             报文 = 报文大小(4 byte) + 报文数据
*/
void Buffer::appendWithSep(const char *data, size_t size)
{

    if(sep_ == 0) {
        buf_.append(data, size);
    } else if ( sep_ == 1) {
        buf_.append((char*)&size, 4);
        buf_.append(data,size);
    } else {
        buf_.append(data,size);
        buf_.append("\r\n", 2);
    }

}

/* 
    函数名: data()
    返回值: 成员Buf的地址
    参  数: 无
    函数作用: 返回Buf的地址
*/
const char* Buffer::data()
{
    return buf_.data();
}

/* 
    函数名: size()
    返回值: 返回buf_大小
    参  数: 无
    函数作用: 返回buf_大小
*/
size_t Buffer::size()
{
    return buf_.size();
}

/* 
    函数名: clear()
    返回值: 无
    参  数: 无
    函数作用: 清除Buf缓冲区的内容
*/
void Buffer::clear()
{
    return buf_.clear();
}

/* 
    函数名: clear()
    返回值: 无
    参  数: 无
    函数作用: 删除Buf_中的数据,从pos开始删除,总共删除n个
*/
void Buffer::erase(ssize_t pos, int n)
{
    buf_.erase(pos,n);
}

/* 
    函数名: pickMessage(std::string &s)
    返回值: 无
    参  数: 无
    函数作用: 找出字符串中的字符
*/
bool Buffer::pickMessage(std::string &ss)
{
    if(buf_.size() == 0) return false;
    if(sep_ == 0)
    {
        ss = buf_;
        buf_.clear();
    }
    else if(sep_ == 1)
    {
        int len; 
        memcpy(&len,buf_.data(),4);
        if (buf_.size() < len + 4) {
            return false;
        }
        //解析数据
        ss = buf_.substr(4,len);
        buf_.erase(0,len + 4);
    }
    else if(sep_ == 2)
    {
        unsigned int loc = 0;
        loc = buf_.find("\r\n");
        if(loc != std::string::npos)
        {
            ss = buf_.substr(0,loc);
        }
        else 
        {
            return false;
        } 
        buf_.erase(0, loc + strlen("\r\n"));
    }
    return true;
}